package com.lagou.server;

import com.lagou.model.User;
import com.lagou.model.UserMessage;

import java.io.IOException;

/**
 * @author StarryHorizon
 * @create 2022-01-07 19:58
 * <p>
 * 编程实现服务器的主功能
 */
public class ServerView {

    /**
     * 使用合成复用原则
     * 私有化 ServerInitClose 类型的对象引用，从而使用其中的输入输出流。
     * 私有化 ServerDao 类型的对象引用，从而使用其中的数据处理的方法。
     */
    private ServerInitClose sic;
    private ServerDao sd;

    /**
     * 通过构造方法实现成员变量的初始化
     */
    public ServerView(ServerInitClose sic, ServerDao sd) {
        this.sic = sic;
        this.sd = sd;
    }

    /**
     * 自定义成员方法实现客户端发来消息的接收并处理
     */
    public void serverReceive() throws IOException, ClassNotFoundException {

        while (true) {
            UserMessage userMessage = (UserMessage) sic.getOis().readObject();
            System.out.println("接收到的消息是：" + userMessage);

            switch (userMessage.getType()) {
                //登录验证功能
                case "managerCheck":
                    managerCheck(userMessage);
                    break;
                    //管理员系统相关功能
                case "addStudent":
                    addStudent(userMessage);
                    break;
                case "deleteStudent":
                    deleteStudent(userMessage);
                    break;
                case "updateStudent":
                    updateStudent(userMessage);
                    break;
                case "searchStudent":
                    searchStudent(userMessage);
                    break;
                default:
                    break;
            }
        }
    }

    private void managerCheck(UserMessage userMessage) throws IOException {
        //调用方法实现管理员账号和密码信息的校验
        if (sd.serverManagerCheck(userMessage.getUser())) {
            userMessage.setType("success");
        } else {
            userMessage.setType("fail");
        }
        //将校验结果发送给客户端
        sic.getOos().writeObject(userMessage);
        System.out.println("服务器发送校验结果成功");
    }


    /**
     * 实现增加学员的功能
     */
    private void addStudent(UserMessage userMessage) throws IOException {
        // 调用方法实现学员的添加
        if (sd.serverAddStudent(userMessage.getUser())) {
            userMessage.setType("success");
            System.out.println("添加学员成功");
        } else {
            userMessage.setType("fail");
            System.out.println("学员信息重复，添加失败");
        }

        // 将结果发送给客户端
        sic.getOos().writeObject(userMessage);
        System.out.println("服务器发送添加学员的结果");
    }

    /**
     * 实现删除学员的功能
     */
    private void deleteStudent(UserMessage userMessage) throws IOException {
        // 调用方法实现学员的删除
        if (sd.serverDelStudent(userMessage.getUser())) {
            userMessage.setType("success");
            System.out.println("删除学员成功");
        } else {
            userMessage.setType("fail");
            System.out.println("学员不存在");
        }

        // 将结果发送给客户端
        sic.getOos().writeObject(userMessage);
        System.out.println("服务器发送删除学员的结果");
    }

    /**
     * 实现更新学员密码的功能
     */
    private void updateStudent(UserMessage userMessage) throws IOException {
        // 调用方法实现学员的更新
        if (sd.serverUpdStudent(userMessage.getUser())) {
            userMessage.setType("success");
            System.out.println("更新学员成功");
        } else {
            userMessage.setType("fail");
            System.out.println("学员不存在");
        }

        // 将结果发送给客户端
        sic.getOos().writeObject(userMessage);
        System.out.println("服务器发送更新学员的结果");
    }

    /**
     * 实现查找学员的功能
     */
    private void searchStudent(UserMessage userMessage) throws IOException {
        // 调用方法实现学员的查找
        User user = sd.serverGetStudent(userMessage.getUser());
        if (user != null) {
            userMessage.setType("success");
            //userMessage.setUser(user);
            System.out.println("查找学员成功：" + user);
        } else {
            userMessage.setType("fail");
            System.out.println("学员不存在");
        }

        // 将结果发送给客户端
        sic.getOos().writeObject(userMessage);
        System.out.println("服务器发送查找学员的结果");
    }


    /**
     * 导入数据库的数据
     */
    public void loadAllFromDataBase() {
        //导入学员信息
        sd.loadUsersFromDatabase();
    }

    /**
     * 保存数据到数据库
     */
    public void saveAllToDataBase() {
        // 保存学员账户数据到数据库
        sd.saveUsersToDataBase();
    }
}
